A “cluster” is the result of “clustering” computing resources together in such a way that they behave like a single resource. Clustering is often used for purposes of parallel processing, load balancing and fault tolerance. One common example of a cluster is a set of computers, or “nodes”, that are configured so that they behave like a single computer. Each computer in the cluster has shared access to a set of resources. A resource is, generally, any item that can be shared by the computers in the cluster. A common example of a resource is a block of memory in which information is stored. The block of memory may be part of a node in the cluster or may be external to the cluster, such as a database block.
A cluster comprises multiple nodes that each executes an instance of a server that facilitates access to a shared set of resources on behalf of clients of the cluster. One example of a cluster is a database cluster. A database cluster comprises multiple nodes that each executes an instance of a database server that facilitates access to a shared database. Among other functions of database management, a database server governs and facilitates access to the particular database by processing requests by clients to access data in the database.
Typically, resources are assigned to masters, where each master coordinates the sharing of the resources assigned to it. A single node is the master of a given shared resource. A master has a global view of the state of the shared resources that it masters at any given time and acts as a coordinator for access to the shared resource. For example, a master coordinates and is aware of which node is currently granted a lock or latch on the shared resource (and what type of lock or latch) and which nodes are queued to obtain a lock or latch on the shared resource. Typically, the master's global view of the status of a shared resource is embodied in metadata associated with the resource.
Each shared resource is mapped to a master. Various mechanisms may be used to establish the resource-to-master mapping. Techniques for using hash tables to establish the resource-to-master mapping are described in detail, for example, in U.S. Pat. No. 6,363,396. The techniques described herein are not limited to any particular mechanism for establishing the resource-to-master mapping.
For efficient management of resources, it is important for each master to quickly locate the information maintained by the master for any of the resources that it masters. To improve access to the resource information, the resources mastered by a given node are often hashed to a table, i.e., a hash table, via a hashing algorithm (“hash function”). Specifically, to locate information maintained for a particular resource, a hash function may be applied to an identifier associated with the resource to produce a hash value. Using the hash value as an index into the hash table, the master locates a hash table entry associated with the resource. From the hash table entry, the master obtains information about the location of the information maintained for the resource.
The hash function effectively sections the hash table into “buckets” to which each resource is mapped. To avoid excessive latch contention while maintaining acceptable and reasonable performance from the cluster, it is desirable to limit the number of resources mapped to a given bucket. Thus, the number of buckets in the resulting hash table is based on (1) a desired per-bucket maximum number of resources, and (2) the number of resources mastered by the node. Thus, to avoid exceeding the desired per-bucket maximum, a node that masters more resources will generally use a hash function that hashes resources to more buckets than the hash function used by a node that masters fewer resources.
FIG. 1 is a diagram that illustrates a set of resources 102a-102n that are mapped into particular buckets, b1-b3, of a hash table 106 through a hash function 104. The hash table 106 is used to access information about the resources being mastered by a master node. In this general example, the hash function takes as input some identifier of the resource being hashed, shown as resource identifier “resid”, and depending on the value that is output, the resource is mapped to a particular bucket of the hash table. Resources that map to the same bucket are associated with each other due to their mapping to the given bucket. Typically, providing a latch to a given resource provides the latch to the entire bucket of resources that hash to the same bucket as the given resource.
In a cluster with asymmetric nodes, where the nodes have asymmetric processing and/or memory capabilities, the number of resources that a given node can master often depends on the node's cache size, which typically depends on the node's overall memory size. Because the number of resources hashed to each bucket is relatively fixed, optimally, a node with more memory will master more resources and, consequently, have a larger hash table (a hash table having more buckets) to access the information maintained by the master for those resources.
Mastership of shared resources in a cluster benefits from dynamic adjustments based on emerging affinity patterns (where a particular node is continuously and/or repeatedly accessing a particular resource set) or for pure load balancing reasons, for example. Dynamic remastering of the shared resources requires a certain freeze stage for redistribution of these resources, whereby information about the resources being remastered is transferred from one node to another, during which lock operations on the remastered resources are not allowed. There is room for improvement in minimizing the freeze time associated with dynamic remastering of resources shared among nodes in a cluster.